/**
 * Copyright 2007-2008. Chongqing First Information & Network Co., Ltd. All
 * rights reserved. <a>http://www.cqfirst.com.cn</a>
 */
package com.cqcis.uip.base.framework.xml.codec;

import org.dom4j.Document;
import org.dom4j.Element;

import com.cqcis.uip.base.framework.utils.XmlWriteUtil;
import com.cqcis.uip.base.framework.xml.XMLEncoder;


/**
 * @author huangmy
 * @date 2007-12-4
 */
public abstract class AbstractXmlEncoder implements XMLEncoder {
	
	private static String defaultEncoding = "UTF-8" ;
	
	/**
	 * XML包编码方式, 默认UTF-8, 其它编码方式重载此方法
	 * @return
	 */
	public String getEncoding() {
		return defaultEncoding ;
	}
	
	/**
	 * 编码
	 */
	public String encode(Object o) throws Exception {
		Document document = XmlWriteUtil.get();

		doEncode(o, document);

		return XmlWriteUtil.create(document, getEncoding());
	}
	
	/**
	 * 执行XML文件转换, 将 o 转换成 document
	 * @param o           - 需要转换的对象
	 * @param document    - 转换后的document
	 * @throws Exception
	 */
	protected abstract void doEncode(Object o, Document document) throws Exception;
	
	/**
	 * 在一个指定的节点 root 下，添加子节点
	 * @param root
	 * @param name
	 * @param value
	 */
	protected Element addElement(Element root, String name, String value) {		
		return XmlWriteUtil.addElement(root, name, value);
	}
	
	/**
	 * 在指定的节点下，添加新节点
	 * @param root
	 * @param name
	 * @return
	 */
	protected Element addElement(Element root, String name) {
		return addElement(root, name, null);
	}
	
	/**
	 * 在指定的节点下，增加节点属性
	 * @param element
	 * @param attributeName
	 * @param attributeValue
	 * @return
	 */
	protected Element addAttribute(Element element, String attributeName, String attributeValue) {
		return element.addAttribute(attributeName, attributeValue != null ? attributeValue : "");
	}
}
